﻿==============================================================================
DOSYA ADI  : PearlGui.cpp
KAYNAK      : -Anti-Cheat\Pearl Guard\PearlGui.cpp
SISTEM      : v2369 Reconnect - ISTEMCI (Pearl Guard)
BOYUT       : 23142 bayt / 1205 satir
ACIKLAMA    : GUI dongusu: PollReconnectUi() cagrisi (satir 27 ve 801)
==============================================================================

--- DOSYA ICERIGI ASAGIDAKI GIBIDIR ------------------------------------

#include "PearlGui.h"

#include "Timer.h"

#include "resource.h"

#include <future>

#include "CSpell.h"

#include "FunctionGuard.h"

#include "../resource.h"

#include <d3dx9.h>

#include "stdafx.h"

#include "UICacheManager.h"



using namespace std;

extern bool ischeatactive;
extern bool CheckForbiddenBackgroundProcessRuntime();
extern void PollReconnectUi();


// FPS Hesaplama ve  izim De i kenleri

float  g_fFPS = 0.0f;

int    g_iFrameCount = 0;

DWORD  g_dwLastFPSTime = 0;

LPD3DXFONT g_pFontFPS = NULL;

LPD3DXFONT pFontScore = NULL;



// --- Cache Kontrolc  ---

bool g_bIsAssetsLoaded = false;



// --- 1vs1 EVENT DE   KENLER  ---

bool g_bIs1v1Active = false;

bool g_bShowResultText = false;

uint8 g_i1v1Round = 0;

uint16 g_i1v1TimeLeft = 0;

uint8 g_iResultType = 0;

DWORD g_dw1v1LastTick = 0;

std::string g_str1v1Player1 = "";

std::string g_str1v1Player2 = "";

int g_i1v1KillsP1 = 0;  // Karus (Sol) Skor

int g_i1v1KillsP2 = 0;  // El Morad (Sa ) Skor

uint8 g_i1v1MaxScore = 0; // Hedef Skor ( rn: 7) 



// --- 1vs1 DXT (G rsel) Objeleri ---

LPDIRECT3DTEXTURE9 g_p1v1BgTexture = NULL;

LPD3DXSPRITE g_p1v1Sprite = NULL;

// ---------------------------------------



HRESULT WINAPI HookCreateDevice();



#define HOOK(func,addy) o##func = (t##func)DetourFunction((PBYTE)addy,(PBYTE)hk##func)

#define D3D_RELEASE(D3D_PTR) if( D3D_PTR ){ D3D_PTR->Release(); D3D_PTR = NULL; }

#define ES  0

#define DIP 1

#define RES 2

#define FOX 3



HRESULT WINAPI hkReset(LPDIRECT3DDEVICE9, D3DPRESENT_PARAMETERS*);

typedef HRESULT(WINAPI* tEndScene)(LPDIRECT3DDEVICE9);

typedef HRESULT(WINAPI* tReset)(LPDIRECT3DDEVICE9, D3DPRESENT_PARAMETERS*);

typedef HRESULT(WINAPI* mySendMessage) (HWND, UINT, WPARAM, LPARAM);



typedef HRESULT(WINAPI* CreateDevice_t)(IDirect3D9* Direct3D_Object, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,

    DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters,

    IDirect3DDevice9** ppReturnedDeviceInterface);

HRESULT WINAPI D3DCreateDevice_hook(IDirect3D9* Direct3D_Object, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,

    DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters,

    IDirect3DDevice9** ppReturnedDeviceInterface);



CreateDevice_t D3DCreateDevice_orig;



typedef HRESULT(WINAPI* tSetScissorRect)(LPDIRECT3DDEVICE9 pDevice, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9* ppSB);

tSetScissorRect  oSetScissorRect;



HRESULT WINAPI SetScissorRect(LPDIRECT3DDEVICE9 pDevice, D3DSTATEBLOCKTYPE Type, IDirect3DStateBlock9* ppSB)

{

    HRESULT ret = oSetScissorRect(pDevice, Type, ppSB);

    ischeatactive = true;

    return ret;

}



PDWORD IDirect3D9_vtable = NULL;

#define CREATEDEVICE_VTI 16



DWORD VTable[4] = { 0 };

DWORD D3DEndScene;

DWORD D3DReset;

tReset oReset;

tEndScene oPresent;

tEndScene oEndScene;

WNDPROC oWndProc;



static int myfpslimit = 60;

static bool isfpslimit = false;

static bool sendHooked = false;

static bool reset = false;

static bool itsMe = false;



LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;

LPDIRECT3DINDEXBUFFER9  g_pIB = NULL;



HWND window = 0;

NOTIFYICONDATA nid;

bool hiddenWindow = false;

bool isF12Pressed = false;



LRESULT __stdcall WndProc(const HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch (uMsg)

    {

    case WM_APP + 1:

        switch (lParam)

        {

        case WM_LBUTTONDBLCLK:

            if (Engine) {

                if (!IsWindowVisible(window)) {

                    ShowWindow(window, SW_SHOW);

                    hiddenWindow = false;

                }

            }

            break;

        }

        break;

    }

    return CallWindowProc(oWndProc, hWnd, uMsg, wParam, lParam);

}



// =========================================================================

// RESET HOOK (Alt+Tab Sonras  Ak c l   n Bozulmamas    in FPS Kilidi Kald r ld )

// =========================================================================

HRESULT WINAPI hkReset(LPDIRECT3DDEVICE9 pDevice, D3DPRESENT_PARAMETERS* Present)

{

    // EKRAN SIFIRLANDI INDA VRAM TEM ZL    (Alt+Tab Crash   z m )

    D3D_RELEASE(g_pFontFPS);

    D3D_RELEASE(pFontScore);

    D3D_RELEASE(g_p1v1Sprite);

    D3D_RELEASE(g_p1v1BgTexture); // D KKAT: Alt+Tab   kmesini  nlemek i in bu eklendi!



    // Cache'lenmi  Texture'lar  temizle ve yeniden y klenmesi i in bayra   s f rla

    CUICacheManager::GetInstance().ReleaseAll();

    g_bIsAssetsLoaded = false;



    if (!Engine) return oReset(pDevice, Present);



    if (Engine->m_SettingsMgr == NULL)

        Engine->m_SettingsMgr = new CSettingsManager();



    Present->Windowed = Engine->m_SettingsMgr->m_iRealFullScreen == 1 ? false : true;



    // --- V-Sync Kapatma ve Ak c l k Optimizasyonu ---

    Present->PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

    Present->FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

    Present->SwapEffect = D3DSWAPEFFECT_DISCARD;

    // --------------------------------------------------------------------



    reset = true;

    return oReset(pDevice, Present);

}



extern CSpell* GetSkillBase(int iSkillID);

DWORD adresdd = 0x33C;

ULONGLONG thtime = GetTickCount64();



// =========================================================================

// YEN  EKLENEN: SAB T G RSEL Y KLEME FONKS YONU

// =========================================================================

void InitVsPanel(LPDIRECT3DDEVICE9 pDevice)

{

    if (!pDevice) return;



    if (g_p1v1Sprite == NULL) {

        D3DXCreateSprite(pDevice, &g_p1v1Sprite);

    }



    if (g_p1v1BgTexture == NULL) {

        // Do rudan okuma - Cache y neticisini bypass ediyoruz

        HRESULT hr = D3DXCreateTextureFromFileA(pDevice, "icon\\1v1_Panel1.png", &g_p1v1BgTexture);

        if (FAILED(hr)) {

            g_p1v1BgTexture = NULL;

        }

    }

}

void DrawNameDynamic(LPDIRECT3DDEVICE9 pDevice, LPD3DXFONT pFont, std::string name, RECT rect, D3DCOLOR color)

{

    if (name.empty()) return;



    //  nce standart font ile  izmeyi dene

    HRESULT hr = pFont->DrawTextA(NULL, name.c_str(), -1, &rect,

        DT_CENTER | DT_VCENTER | DT_SINGLELINE | DT_NOCLIP, 0); // G r nmez  izip geni li i  l 



    // E er isim 55px'ten uzunsa k   k fontu tetikle

    RECT rcCalc = rect;

    pFont->DrawTextA(NULL, name.c_str(), -1, &rcCalc, DT_CALCRECT | DT_SINGLELINE, 0);



    int textWidth = rcCalc.right - rcCalc.left;



    if (textWidth > 50) // 55px kutu i in 50px'i ge ince k   lt

    {

        LPD3DXFONT pSmallFont = NULL;

        D3DXCreateFontA(pDevice, 11, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,

            OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &pSmallFont);



        if (pSmallFont) {

            pSmallFont->DrawTextA(NULL, name.c_str(), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE, color);

            pSmallFont->Release();

            return;

        }

    }



    // S   yorsa normal fontla  iz

    pFont->DrawTextA(NULL, name.c_str(), -1, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE, color);

}

HRESULT WINAPI hkEndScene(LPDIRECT3DDEVICE9 pDevice)

{

    if (!Engine) return oEndScene(pDevice);

    if (!Engine->render || !Engine->power) return oEndScene(pDevice);



    if (GetAsyncKeyState(VK_F12) & 0x8000)

    {

        if (!isF12Pressed)

        {

            isF12Pressed = true;

            if (GetForegroundWindow() == window) {

                ShowWindow(window, false);

                hiddenWindow = true;

            }

        }

    }

    else

    {

        isF12Pressed = false;

    }



    if (!sendHooked)

    {

        sendHooked = true;

        Engine->m_UiMgr = new CUIManager();

        Engine->m_UiMgr->Init(pDevice);

        Engine->InitSendHook();

        Engine->InitRecvHook();

        Engine->InitSetString();



        for (uint32 i = 101001; i <= 610159; i++)

        {

            CSpell* spell = GetSkillBase(i);

            if (spell) {

                Engine->skillmap.insert({ spell->dwID, *spell });

                SpellCRC crc(crc32((uint8*)(DWORD)spell, 0xA8, 0xFFFFFFFF), crc32((uint8*)((DWORD)spell + 0xB4), 0x2C, 0xFFFFFFFF));

                Engine->skillcrc.insert({ spell->dwID + 2031, crc });

                Engine->skillmapBackup.insert({ spell->dwID, *spell });

            }

        }

    }



    if (reset)

    {

        reset = false;

        if (Engine->uiTaskbarMain) Engine->uiTaskbarMain->UpdatePosition();

    }



    // Y KLEME EKRANINI VE   Z M OLMAYAN MODLARI ATLA

    if (!Engine->drawMode || Engine->Loading == true)

        return oEndScene(pDevice);



    // ---> SADECE OYUN    NDE   ZD RME KONTROL  (LOGIN HAR  ) <---

    bool isKarakterOyunda = (Engine->m_PlayerBase != NULL);

    if (isKarakterOyunda)

    {

        CheckForbiddenBackgroundProcessRuntime();

        //  LK   Z MDE ASSETLER  PRE-LOAD ET

        if (!g_bIsAssetsLoaded && pDevice != NULL)

        {

            CUICacheManager::GetInstance().PreLoadAssets(pDevice);

            g_bIsAssetsLoaded = true;

        }



        // --- FPS HESAPLAMA ---

        ULONGLONG dwCurrentTime = GetTickCount64();

        g_iFrameCount++;



        if (dwCurrentTime - g_dwLastFPSTime >= 1000)

        {

            g_fFPS = (float)g_iFrameCount / ((float)(dwCurrentTime - g_dwLastFPSTime) / 1000.0f);

            g_dwLastFPSTime = (DWORD)dwCurrentTime;

            g_iFrameCount = 0;

        }



        // --- 1vs1 ZAMANLAYICI HESAPLAMA ---

        if (g_bIs1v1Active && GetTickCount64() - g_dw1v1LastTick >= 1000) {

            if (g_i1v1TimeLeft > 0) g_i1v1TimeLeft--;

            g_dw1v1LastTick = (DWORD)GetTickCount64();

        }



        // --- FONT OLU TURMA ---

        if (g_pFontFPS == NULL && pDevice != NULL) {

            D3DXCreateFontA(pDevice, 15, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,

                OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &g_pFontFPS);

        }



        if (pFontScore == NULL && pDevice != NULL) {

            D3DXCreateFontA(pDevice, 22, 0, FW_HEAVY, 1, FALSE, DEFAULT_CHARSET,

                OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &pFontScore);

        }



        if (g_pFontFPS)

        {

            // 1. MEVCUT FPS   Z M 

            char szFPS[32];

            sprintf_s(szFPS, "FPS: %.0f", g_fFPS);



            int xPos = 329;

            int yPos = 25;

            int bgWidth = 65;

            int bgHeight = 18;



            D3DRECT rect = { xPos, yPos, xPos + bgWidth, yPos + bgHeight };

            pDevice->Clear(1, &rect, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255, 0, 0, 0), 0, 0);



            RECT rcFPS = { xPos + 5, yPos + 1, xPos + bgWidth, yPos + bgHeight };

            g_pFontFPS->DrawTextA(NULL, szFPS, -1, &rcFPS, DT_NOCLIP, D3DCOLOR_ARGB(255, 0, 255, 0));



            // === 2. 1VS1 PANEL (128x256 SAB T G RSEL) ===

            if (g_bIs1v1Active)

            {

                // Doku veya sprite eksikse/silindiyse yeniden ba lat

                if (g_p1v1BgTexture == NULL || g_p1v1Sprite == NULL) {

                    InitVsPanel(pDevice);

                }



                float startX = 404.0f;

                float startY = 25.0f;



                // Arka plan   iz

                if (g_p1v1BgTexture && g_p1v1Sprite)

                {

                    D3DXVECTOR3 pos(startX, startY, 0.0f);

                    g_p1v1Sprite->Begin(D3DXSPRITE_ALPHABLEND);

                    g_p1v1Sprite->Draw(g_p1v1BgTexture, NULL, NULL, &pos, 0xFFFFFFFF);

                    g_p1v1Sprite->End();

                }



                // Yaz   izimleri (Ortalanm    ekilde)

                if (g_pFontFPS)

                {

                    DWORD textFlags = DT_CENTER | DT_VCENTER | DT_SINGLELINE;



                    // 1. S RE KUTUSU

                    char szTime[32];

                    sprintf_s(szTime, "%02d:%02d", g_i1v1TimeLeft / 60, g_i1v1TimeLeft % 60);

                    RECT rcTime = { (LONG)startX + 14, (LONG)startY + 75, (LONG)startX + 114, (LONG)startY + 94 };

                    g_pFontFPS->DrawTextA(NULL, szTime, -1, &rcTime, textFlags, D3DCOLOR_ARGB(255, 255, 255, 255));



                    // 2. 1. OYUNCU  SM  (G ncel Koordinatlar)

                    RECT rcP1 = { 423, 129, 423 + 55, 129 + 29 };

                    DrawNameDynamic(pDevice, g_pFontFPS, g_str1v1Player1, rcP1, D3DCOLOR_ARGB(255, 220, 220, 220));



                    // 3. 1. OYUNCU SKORU

                    LPD3DXFONT scoreFont = pFontScore ? pFontScore : g_pFontFPS;

                    char szScore1[32]; sprintf_s(szScore1, "%d", g_i1v1KillsP1);

                    RECT rcScore1 = { (LONG)startX + 86, (LONG)startY + 104, (LONG)startX + 114, (LONG)startY + 133 };

                    scoreFont->DrawTextA(NULL, szScore1, -1, &rcScore1, textFlags, D3DCOLOR_ARGB(255, 100, 150, 255));



                    // 4. 2. OYUNCU  SM  (G ncel Koordinatlar)

                    RECT rcP2 = { 423, 169, 423 + 55, 169 + 29 };

                    DrawNameDynamic(pDevice, g_pFontFPS, g_str1v1Player2, rcP2, D3DCOLOR_ARGB(255, 220, 220, 220));



                    // 5. 2. OYUNCU SKORU

                    char szScore2[32]; sprintf_s(szScore2, "%d", g_i1v1KillsP2);

                    RECT rcScore2 = { (LONG)startX + 86, (LONG)startY + 143, (LONG)startX + 114, (LONG)startY + 172 };

                    scoreFont->DrawTextA(NULL, szScore2, -1, &rcScore2, textFlags, D3DCOLOR_ARGB(255, 100, 255, 100));



                    // 6. TARGET SCORE (Hedef Skor)

                    char szScoreInfo[32];

                    sprintf_s(szScoreInfo, "%d", g_i1v1MaxScore);

                    RECT rcTarget = { (LONG)startX + 74, (LONG)startY + 185, (LONG)startX + 114, (LONG)startY + 205 };

                    g_pFontFPS->DrawTextA(NULL, szScoreInfo, -1, &rcTarget, textFlags, D3DCOLOR_ARGB(255, 255, 215, 0));

                }

            }

            else

            {

                g_i1v1KillsP1 = 0;

                g_i1v1KillsP2 = 0;

                g_i1v1MaxScore = 0;

            }

        }

    }



    // === UI MANTIK   LEMLER N  60 FPS'YE (16ms) SAB TLEME ===

    static ULONGLONG dwLastUITick = 0;

    ULONGLONG dwCurrentUITime = GetTickCount64();



    if (dwCurrentUITime - dwLastUITick >= 16)

    {

        if (Engine->uiLogin == NULL)

        {

            Engine->uiLogin = new CUILogin();

            if (Engine->uiLogin->m_bGroupLogin == NULL)

                Engine->uiLogin = NULL;

        }



        if (Engine->uiAnvil) Engine->uiAnvil->Tick();

        if (Engine->uiState) Engine->uiState->Tick();

        if (Engine->uiTradePrice) Engine->uiTradePrice->Tick();

        if (Engine->uiSkillPage) Engine->uiSkillPage->Tick();

        if (Engine->uiScoreBoard) Engine->uiScoreBoard->Tick();



        if (Engine->m_UiMgr) {
            PollReconnectUi();
            Engine->m_UiMgr->Tick();
        }



        if (Engine->uiLottery) Engine->uiLottery->Tick();

        if (Engine->uiCindirella) Engine->uiCindirella->Tick();

        if (Engine->uiHPBarPlug) Engine->uiHPBarPlug->Tick();

        if (Engine->uiWheel) Engine->uiWheel->Tick();



        if (Engine->IsCRActive && Engine->uiCollection)

            Engine->uiCollection->Tick();



        if (Engine->uiEventShowList) Engine->uiEventShowList->Tick();

        if (Engine->uiQuestPage) Engine->uiQuestPage->Tick();

        if (Engine->uiGenieMain) Engine->uiGenieMain->Tick();



        dwLastUITick = dwCurrentUITime;

    }



    if (Engine->m_UiMgr) {

        Engine->m_UiMgr->Render();

    }



    // === THREAD Y NET M  ===

    if (Engine->AutoUpThread) ResumeThread(Engine->AutoUpThread);



    ULONGLONG thcurrentTime = GetTickCount64();

    if (thcurrentTime > thtime) {

        if (Engine->MainThread) ResumeThread(Engine->MainThread);

        if (Engine->AliveThread) ResumeThread(Engine->AliveThread);

        if (Engine->ScanThread) ResumeThread(Engine->ScanThread);

        if (Engine->TitleThread) ResumeThread(Engine->TitleThread);

        if (Engine->LisansThread) ResumeThread(Engine->LisansThread);

        if (Engine->ClassThread) ResumeThread(Engine->ClassThread);

        thtime = thcurrentTime + 1000;

    }



    return oEndScene(pDevice);

}



LRESULT CALLBACK MsgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

    return DefWindowProc(hwnd, uMsg, wParam, lParam);

}



void DX_Init(DWORD* table)

{

    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, xorstr("DX"), NULL };

    RegisterClassEx(&wc);

    HWND hWnd = CreateWindow(xorstr("DX"), NULL, WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, GetDesktopWindow(), NULL, wc.hInstance, NULL);

    LPDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));

    d3dpp.Windowed = TRUE;

    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    LPDIRECT3DDEVICE9 pd3dDevice;

    itsMe = true;

    pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED, &d3dpp, &pd3dDevice);

    itsMe = false;

    DWORD* pVTable = (DWORD*)pd3dDevice;

    pVTable = (DWORD*)pVTable[0];



    table[FOX] = pVTable[17];

    table[ES] = pVTable[42];

    table[DIP] = pVTable[82];

    table[RES] = pVTable[16];



    D3D_RELEASE(pd3dDevice);

    D3D_RELEASE(pD3D);

    DestroyWindow(hWnd);

}



DWORD FindDevice(DWORD Len)

{

    DWORD dwObjBase = 0;



    dwObjBase = (DWORD)LoadLibraryA("d3d9.dll");

    while (dwObjBase++ < dwObjBase + Len)

        if ((*(WORD*)(dwObjBase + 0x00)) == 0x06C7 && (*(WORD*)(dwObjBase + 0x06)) == 0x8689 && (*(WORD*)(dwObjBase + 0x0C)) == 0x8689) {

            dwObjBase += 2; break;

        }



    return(dwObjBase);

}



DWORD GetDeviceAddress(int VTableIndex)

{

    PDWORD VTableBase;

    *(DWORD*)&VTableBase = *(DWORD*)FindDevice(0x128000);

    return VTableBase[VTableIndex];

}



DWORD WINAPI InitGUI()

{

    while (GetModuleHandle(xorstr("d3d9.dll")) == NULL)

    {

        Sleep(250);

    }



    DX_Init(VTable);



    HOOK(EndScene, VTable[ES]);

    HOOK(Reset, VTable[RES]);



    char buff[50];

    ZeroMemory(buff, 50);

    sprintf_s(buff, "BUHUR 2369 Client[%d]", GetCurrentProcessId());



    oSetScissorRect = (tSetScissorRect)DetourFunction((PBYTE)GetDeviceAddress(59), (PBYTE)SetScissorRect);



    window = NULL;

    while (window == NULL) {

        Sleep(100);

        window = FindWindowA(NULL, buff);

    }



    oWndProc = (WNDPROC)SetWindowLongPtr(window, GWL_WNDPROC, (LONG_PTR)WndProc);

    std::memset(&nid, 0, sizeof(nid));

    nid.cbSize = sizeof(nid);

    nid.hWnd = window;

    nid.uID = 0;

    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;

    nid.uCallbackMessage = WM_APP + 1;

    nid.hIcon = LoadIcon(GetModuleHandle("BuhuR.dll"), MAKEINTRESOURCE(IDI_ICON1));

    lstrcpy(nid.szTip, buff);

    Shell_NotifyIcon(NIM_ADD, &nid);

    Shell_NotifyIcon(NIM_SETVERSION, &nid);



    return 0;

}



void UIMain()

{

    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)InitGUI, NULL, NULL, NULL);

}



BYTE ByteExt(DWORD ulBase)

{

    if (!IsBadReadPtr((VOID*)ulBase, sizeof(BYTE)))

    {

        return(*(BYTE*)(ulBase));

    }

    return 0;

}



const DWORD KO_MULTI_CAP = 0xC93EBC;

const DWORD KO_MUTEX = 0xA99F11;



DWORD WINAPI MultiPatch()

{

    char buff[50];

    sprintf_s(buff, "Buhur 2369 Client[%d]", GetCurrentProcessId());

    memcpy((LPVOID)KO_MULTI_CAP, buff, 50);

    return 1;

}



void PatchMulti()

{

    CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)MultiPatch, NULL, NULL, NULL);

}



HRESULT WINAPI HookCreateDevice()

{

    IDirect3D9* device = Direct3DCreate9(D3D_SDK_VERSION);

    if (!device)

        return D3DERR_INVALIDCALL;



    IDirect3D9_vtable = (DWORD*)*(DWORD*)device;

    device->Release();

    DWORD protectFlag;

    if (VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), PAGE_READWRITE, &protectFlag))

    {

        *(DWORD*)&D3DCreateDevice_orig = IDirect3D9_vtable[CREATEDEVICE_VTI];

        *(DWORD*)&IDirect3D9_vtable[CREATEDEVICE_VTI] = (DWORD)D3DCreateDevice_hook;

        if (!VirtualProtect(&IDirect3D9_vtable[CREATEDEVICE_VTI], sizeof(DWORD), protectFlag, &protectFlag))

        {

            return D3DERR_INVALIDCALL;

        }

    }

    else

        return D3DERR_INVALIDCALL;



    return D3D_OK;

}



HRESULT WINAPI D3DCreateDevice_hook(IDirect3D9* Direct3D_Object, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface)

{

    if (!itsMe)

    {

        if (Engine && Engine->m_SettingsMgr == NULL)

            Engine->m_SettingsMgr = new CSettingsManager();



        if (Engine && Engine->m_SettingsMgr) {

            pPresentationParameters->Windowed = Engine->m_SettingsMgr->m_iRealFullScreen == 1 ? false : true;



            pPresentationParameters->PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;

            pPresentationParameters->FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;

            pPresentationParameters->SwapEffect = D3DSWAPEFFECT_DISCARD;

        }

    }



    return D3DCreateDevice_orig(Direct3D_Object, Adapter, DeviceType, hFocusWindow, BehaviorFlags | D3DCREATE_MULTITHREADED, pPresentationParameters, ppReturnedDeviceInterface);

}